﻿' ******************************************************************************
' ** 
' **  Yahoo Finance Managed
' **  Written by Marius Häusler 2010
' **  It would be pleasant, if you contact me when you are using this code.
' **  Contact: YahooFinanceManaged@gmail.com
' **  Project Home: http://code.google.com/p/yahoo-finance-managed/
' **  
' ******************************************************************************
' **  
' **  Copyright 2010 Marius Häusler
' **  
' **  Licensed under the Apache License, Version 2.0 (the "License");
' **  you may not use this file except in compliance with the License.
' **  You may obtain a copy of the License at
' **  
' **    http://www.apache.org/licenses/LICENSE-2.0
' **  
' **  Unless required by applicable law or agreed to in writing, software
' **  distributed under the License is distributed on an "AS IS" BASIS,
' **  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
' **  See the License for the specific language governing permissions and
' **  limitations under the License.
' ** 
' ******************************************************************************


Namespace Finance

    ''' <summary>
    ''' Stores informations of different quote values. Implements IID. Serializable.
    ''' </summary>
    ''' <remarks></remarks>
    <Serializable()> _
    Public Class QuoteData
        Inherits QuoteBaseData

        Private mValues(Convert.ToInt32(QuoteProperty.YearRange)) As Object

        ''' <summary>
        ''' Gets or sets the value of a specfic property
        ''' </summary>
        ''' <param name="prp">Gets or sets the property you want to get or set</param>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Default Public Property Values(ByVal prp As QuoteProperty) As Object
            Get
                Return mValues(prp)
            End Get
            Set(ByVal value As Object)
                mValues(prp) = value
                If value IsNot Nothing Then
                    Select Case prp
                        Case QuoteProperty.Symbol : MyBase.SetID(value.ToString)
                        Case QuoteProperty.LastTradePriceOnly : If value.GetType Is GetType(Double) Then Double.TryParse(value.ToString, MyBase.LastTradePriceOnly)
                        Case QuoteProperty.LastTradeDate : If value.GetType Is GetType(Date) Then Date.TryParse(value.ToString, MyBase.LastTradeDate)
                        Case QuoteProperty.LastTradeTime : If value.GetType Is GetType(Date) Then Date.TryParse(value.ToString, MyBase.LastTradeTime)
                        Case QuoteProperty.Change : If value.GetType Is GetType(Double) Then Double.TryParse(value.ToString, MyBase.Change)
                        Case QuoteProperty.Open : If value.GetType Is GetType(Double) Then Double.TryParse(value.ToString, MyBase.Open)
                        Case QuoteProperty.DaysHigh : If value.GetType Is GetType(Double) Then Double.TryParse(value.ToString, MyBase.DaysHigh)
                        Case QuoteProperty.DaysLow : If value.GetType Is GetType(Double) Then Double.TryParse(value.ToString, MyBase.DaysLow)
                        Case QuoteProperty.Volume : If value.GetType Is GetType(Long) Then Long.TryParse(value.ToString, MyBase.Volume)
                    End Select
                End If
            End Set
        End Property
        ''' <summary>
        ''' Gets or sets the name of the QuoteData
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks>Represents the value of QuoteProperty.Name</remarks>
        Public Property Name() As String
            Get
                If mValues(QuoteProperty.Name) IsNot Nothing Then : Return mValues(QuoteProperty.Name).ToString
                Else : Return String.Empty
                End If
            End Get
            Set(ByVal value As String)
                mValues(QuoteProperty.Name) = value
            End Set
        End Property
        ''' <summary>
        ''' Gets the ID of the QuoteData
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks>Represents the value of QuoteProperty.Symbol</remarks>
        Public Overloads ReadOnly Property ID() As String
            Get
                Return MyBase.ID
            End Get
        End Property
        ''' <summary>
        ''' Sets a new ID value. Implementation from ISettableID.
        ''' </summary>
        ''' <param name="id">A valid Yahoo! ID</param>
        ''' <remarks></remarks>
        Public Overloads Sub SetID(ByVal id As String)
            MyBase.SetID(id)
            mValues(QuoteProperty.Symbol) = id
        End Sub

        ''' <summary>
        ''' Gets or sets the latest price value of the QuoteData.
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks>Represents the value of QuoteProperty.LastTradePriceOnly</remarks>
        Public Overloads Property LastTradePriceOnly() As Double
            Get
                Return MyBase.LastTradePriceOnly
            End Get
            Set(ByVal value As Double)
                MyBase.LastTradePriceOnly = value
                mValues(QuoteProperty.LastTradePriceOnly) = value
            End Set
        End Property
        ''' <summary>
        ''' Gets or sets the date value of the last trade.
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Overloads Property LastTradeDate() As Date
            Get
                Return MyBase.LastTradeDate
            End Get
            Set(ByVal value As Date)
                MyBase.LastTradeDate = value
                mValues(QuoteProperty.LastTradeDate) = value
            End Set
        End Property
        ''' <summary>
        ''' Gets or sets the time value of the last trade.
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Overloads Property LastTradeTime() As DateTime
            Get
                Return MyBase.LastTradeTime
            End Get
            Set(ByVal value As DateTime)
                MyBase.LastTradeTime = value
                mValues(QuoteProperty.LastTradeTime) = value
            End Set
        End Property
        ''' <summary>
        ''' Gets or sets the change in percent.
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Overloads Property Change() As Double
            Get
                Return MyBase.Change
            End Get
            Set(ByVal value As Double)
                MyBase.Change = value
                mValues(QuoteProperty.Change) = value
            End Set
        End Property
        ''' <summary>
        ''' Gets or sets the opening price value of the day.
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Overloads Property Open() As Double
            Get
                Return MyBase.Open
            End Get
            Set(ByVal value As Double)
                MyBase.Open = value
                mValues(QuoteProperty.Open) = value
            End Set
        End Property
        ''' <summary>
        ''' Gets or sets the highest price value of the day.
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Overloads Property DaysHigh() As Double
            Get
                Return MyBase.DaysHigh
            End Get
            Set(ByVal value As Double)
                MyBase.DaysHigh = value
                mValues(QuoteProperty.DaysHigh) = value
            End Set
        End Property
        ''' <summary>
        ''' Gets or sets the lowest price value of the day.
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Overloads Property DaysLow() As Double
            Get
                Return MyBase.DaysLow
            End Get
            Set(ByVal value As Double)
                MyBase.DaysLow = value
                mValues(QuoteProperty.DaysLow) = value
            End Set
        End Property
        ''' <summary>
        ''' Gets or sets the trade volume of the day.
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Overloads Property Volume() As Long
            Get
                Return MyBase.Volume
            End Get
            Set(ByVal value As Long)
                MyBase.Volume = value
                mValues(QuoteProperty.Volume) = value
            End Set
        End Property

        ''' <summary>
        ''' Default constructor
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub New()
        End Sub

        ''' <summary>
        ''' Copies the values of a QuoteData to this instance.
        ''' </summary>
        ''' <param name="newValue"></param>
        ''' <remarks></remarks>
        Public Shadows Sub CopyData(ByVal newValue As QuoteData)
            MyBase.CopyData(newValue)
            For i As QuoteProperty = 0 To QuoteProperty.YearRange
                mValues(CInt(i)) = newValue(i)
            Next
        End Sub

    End Class

End Namespace